package com.sh.data.engine.infrastructure.storage;

import io.minio.ComposeSource;
import io.minio.GetObjectResponse;
import io.minio.messages.Bucket;

import java.io.File;
import java.io.InputStream;
import java.util.List;

/**
 * @author: mengzheng.mhc
 * @date: 2024/6/11 11:23
 */
public interface MinioClientService {

    /**
     * 新建bucket,创建后该bucket无任何policy（即私有bucket）
     *
     * @param bucketName
     * @return
     */
    void createBucket(String bucketName);

    /**
     * 设置bucket的policy
     *
     * @param bucketName
     * @param policy
     * @return
     */
    void setBucketPolicy(String bucketName, String policy);

    /**
     * 设置bucket是否加密，需kes支持
     *
     * @param bucketName
     * @return
     */
    void setBucketEncryption(String bucketName);

    /**
     * 获取bucket列表
     *
     * @return
     */
    List<Bucket> listBuckets();

    /**
     * 删除bucket
     *
     * @param bucketName
     * @return
     */
    void removeBucket(String bucketName);

    /**
     * 在某个bucket下新建文件夹
     *
     * @param bucketName
     * @param folder
     * @return
     */
    void createFolder(String bucketName, String folder);

    /**
     * 在某个bucket下新建文件夹
     *
     * @param bucketName
     * @param parentFolder
     * @param currentFolder
     * @return
     */
    void createFolder(String bucketName, String parentFolder, String currentFolder);

    /**
     * 上传文件，以流方式
     *
     * @param bucketName
     * @param folder
     * @param fileName
     * @param stream
     * @return
     */
    void putObject(String bucketName, String folder, String fileName, InputStream stream);

    /**
     * 生成文件的访问链接
     *
     * @param object
     * @param expireSecond
     * @return
     */
    String getFileUrl(String bucket, String object, Integer expireSecond, Boolean bucketPublic);

    /**
     * 下载文件到临时目录
     *
     * @param bucket
     * @param object
     * @return
     */
    File downloadFile(String bucket, String object, String fileName);

    /**
     * 删除文件
     *
     * @param bucket
     * @param object
     */
    void removeFile(String bucket, String object);

    /**
     * 获取文件对象
     *
     * @param bucket
     * @param object
     */
    GetObjectResponse getObject(String bucket, String object);

    /**
     * 合并文件
     *
     * @param bucket
     * @param object
     * @param sourceObjectList
     */
    void composeObject(String bucket, String object, List<ComposeSource> sourceObjectList);

    /**
     * 判断bucket是否存在
     *
     * @param bucket
     * @return
     */
    Boolean bucketExists(String bucket);

    /**
     * bucket是否为空
     *
     * @param bucket
     * @param excludeEngineTempFolder 是否排除数据集成引擎的临时目录
     * @return
     */
    Boolean isBucketEmpty(String bucket, boolean excludeEngineTempFolder);
}
